package com.lanxin.mp.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lanxin.mp.controller.MpCardtypeController;
import com.lanxin.mp.entity.MpCardtype;
import com.lanxin.mp.entity.MpContact;
import com.lanxin.mp.mapper.MpContactMapper;
import com.lanxin.mp.service.IMpCardtypeService;
import com.lanxin.mp.service.IMpContactService;
import com.lanxin.mp.vo.UserContact;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 名片服务实现（包含所有业务逻辑）
 */
@Service
public class MpContactServiceImpl extends ServiceImpl<MpContactMapper, MpContact> implements IMpContactService {

    private static final Logger logger = Logger.getLogger(MpContactServiceImpl.class);


    @Autowired
    private IMpCardtypeService mpCardtypeService;


    /**
     * 原分页查询（单表）- 保留
     */
    @Override
    public IPage<MpContact> listContactPage(Integer eid,Integer page, Integer pageSize, String name, String sex, String company, String typeid,String mobile) {
        Page<MpContact> pageParam = new Page<>(page, pageSize);
        QueryWrapper<MpContact> queryWrapper = new QueryWrapper<>();

        // 关联类型表过滤员工数据（原逻辑缺失，补充）
        queryWrapper.inSql("typeid", "SELECT oid FROM mp_cardtype WHERE eid = " + eid);

        // 动态条件
        if(StringUtils.hasText(name)) queryWrapper.like("name", name);
        if(StringUtils.hasText(sex)) queryWrapper.eq("sex", sex);
        if(StringUtils.hasText(company)) queryWrapper.like("company", company);
        if(StringUtils.hasText(typeid)) queryWrapper.eq("typeid", typeid);
        if(StringUtils.hasText(mobile)) queryWrapper.like("mobile", mobile);

        return baseMapper.selectPage(pageParam, queryWrapper);
    }

    /**
     * 发送名片
     * @param oids
     * @param empid
     * @param sendEmpName
     * @return
     */

    @Override
    @Transactional
    public boolean batchSendToEmp(List<Long> oids, Integer empid, String sendEmpName) {
        //强制执行
//        MpCardtype testType = new MpCardtype();
//        testType.setType("测试2025-08-28发给您的名片");
//        testType.setEid(empid); // 接收方ID
//        boolean testSave = mpCardtypeService.save(testType);
//        logger.info("测试类型创建结果：" + testSave + "，oid：" + testType.getOid());

        // 1. 基础参数校验（防止空指针和无效参数）
        if (oids == null || oids.isEmpty()) {
            logger.error("未选择名片");
            return false;
        }
        if (empid == null || empid <= 0) {
            logger.error("接收员工ID无效");
            return false;
        }
        if (StringUtils.isEmpty(sendEmpName)) {
            logger.error("发送者姓名为空");
            return false;
        }

        try {

            // 2. 生成唯一类型名称（带长度限制，替换原有逻辑）
            String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
            String fixedSuffix = date + "发给您的名片"; // 固定后缀（含日期）
            int maxTypeNameLength = 100; // 与数据库字段长度保持一致（varchar(100)）
            int maxSendNameLength = maxTypeNameLength - fixedSuffix.length();

            // 截断发送者姓名，避免总长度超限
            if (sendEmpName != null && sendEmpName.length() > maxSendNameLength) {
                sendEmpName = sendEmpName.substring(0, maxSendNameLength);
                logger.warn("发送者姓名过长，已截断为：" + sendEmpName);
            }

            // 最终类型名称（总长度≤100）
            String typeName = sendEmpName + fixedSuffix;
            logger.info("生成类型名称（长度" + typeName.length() + "）：" + typeName);


//            // 2. 生成唯一类型名称（发送者姓名+当前日期+固定后缀）
//            String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
//            String typeName = sendEmpName + date + "发给您的名片";
//            logger.info("生成名片类型名称：" + typeName + "，接收方empid=" + empid);


            // 3. 检查接收方是否已存在该类型，不存在则创建
            MpCardtype cardtype = new MpCardtype();
            cardtype.setType(typeName);
            cardtype.setEid(empid); // 类型归属接收方

            QueryWrapper<MpCardtype> query = new QueryWrapper<>();
            query.eq("type", typeName)
                    .eq("eid", empid); // 同时匹配类型名称和接收方ID

            long count = mpCardtypeService.count(query);
            logger.info("类型存在性检查：" + (count > 0 ? "已存在" : "不存在，将创建"));

            if (count == 0) {
                // 3.1 新增类型（设置默认值防止字段约束错误）
                cardtype.setType(typeName); // 确保类型名称正确
                boolean saveSuccess = mpCardtypeService.save(cardtype);
                if (!saveSuccess) {
                    logger.error("类型创建失败：保存操作返回false，typeName=" + typeName);
                    return false;
                }
                logger.info("成功创建新类型，oid=" + cardtype.getOid());
            } else {
                // 3.2 复用已有类型（添加空指针防护）
                cardtype = mpCardtypeService.getOne(query.last("LIMIT 1"));
                if (cardtype == null) {
                    logger.error("严重错误：类型count>0但查询结果为null，typeName=" + typeName);
                    return false;
                }
                logger.info("复用已有类型，oid=" + cardtype.getOid());
            }

            // 4. 获取类型ID（此时cardtype一定非空）
            Integer typeid = cardtype.getOid();
            if (typeid == null) {
                logger.error("类型ID为空，创建/查询类型失败");
                return false;
            }

            // 5. 复制原名片并关联新类型
            List<MpContact> newContacts = new ArrayList<>(oids.size());
            for (Long oid : oids) {
                // 5.1 校验原名片ID有效性
                if (oid == null || oid <= 0) {
                    logger.warn("跳过无效名片ID：" + oid);
                    continue;
                }

                // 5.2 查询原名片（兼容Long类型ID）
                MpContact original = baseMapper.selectById(oid);
                if (original == null) {
                    logger.warn("原名片不存在，oid=" + oid);
                    continue;
                }

                // 5.3 复制字段（排除主键，关联新类型）
                MpContact copy = new MpContact();
                copy.setTypeid(typeid); // 关联新类型
                copy.setName(original.getName());
                copy.setSex(original.getSex());
                copy.setCompany(original.getCompany());
                copy.setMobile(original.getMobile());
                copy.setHomePhone(original.getHomePhone());
                copy.setOfficePhone(original.getOfficePhone());
                copy.setHomeAddress(original.getHomeAddress());
                copy.setHomeZipcode(original.getHomeZipcode());
                copy.setOfficeAddress(original.getOfficeAddress());
                copy.setOfficeZipcode(original.getOfficeZipcode());
                copy.setEmail1(original.getEmail1());
                copy.setEmail2(original.getEmail2());
                copy.setOther(original.getOther());

                newContacts.add(copy);
            }

            // 6. 批量保存新名片（至少有一条有效数据才保存）
            if (newContacts.isEmpty()) {
                logger.warn("没有可复制的有效名片，发送终止");
                return false;
            }

            boolean batchSuccess = saveBatch(newContacts);
            logger.info("批量保存结果：" + batchSuccess + "，共" + newContacts.size() + "条名片");
            return batchSuccess;

        } catch (Exception e) {
            // 捕获所有异常，记录详细堆栈
            logger.error("批量发送名片异常", e);
            return false; // 事务会自动回滚
        }
    }

    /**
     * 新增：多表分页查询VO（核心修复）
     * 逻辑：仅传递参数+调用Mapper，无复杂处理
     */
    @Override
    public IPage<UserContact> listContactVOByPage(Integer eid, Integer page, Integer pageSize, String name, String sex, String company, String typeid, String mobile) {
        // 1. 构建分页参数
        Page<UserContact> pageParam = new Page<>(page, pageSize);
        // 2. 调用Mapper多表查询（SQL已包含条件过滤）
        return baseMapper.listContactVOByPage(pageParam, eid, name, sex, company, typeid, mobile);
    }

    /**
     * 详情查询（含关联数据）- 保留
     */
    @Override
    public Map<String, Object> getContactDetail(Long oid) {
        Map<String, Object> result = new HashMap<>(2);
        MpContact contact = baseMapper.selectById(oid);
        result.put("contact", contact);

        if (contact != null ) {
            MpCardtype cardtype = mpCardtypeService.getById(contact.getTypeid());
            result.put("typeName", cardtype != null ? cardtype.getType() : "");
        } else {
            result.put("typeName", "");
        }
        return result;
    }

    /**
     * 保存名片-保留
     */
    @Override
    public boolean saveContact(MpContact contact) {
        return baseMapper.insert(contact) > 0;
    }

    /**
     * 更新名片-保留
     */
    @Override
    public boolean updateContact(MpContact contact) {
        return baseMapper.updateById(contact) > 0;
    }

    /**
     * 改类型
     */
    @Override
    public boolean batchUpdateTypeid(List<Long> oids, Integer typeid) {
        if (oids.isEmpty() || typeid == null) return false;
        UpdateWrapper<MpContact> updateWrapper = new UpdateWrapper<>();
        updateWrapper.in("oid", oids).set("typeid", typeid);
        return baseMapper.update(null, updateWrapper) > 0;
    }

    /**
     * 批量发送名片-保留
     */
    @Override
    public boolean batchSendToEmp(List<Long> oids, Integer empid) {
        if (oids.isEmpty() || empid == null) return false;
        // 实际业务需补充：验证员工+记录分享关系，此处保留原逻辑
        return true;
    }
}